/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.cezary.butler.walili.server.db.tasks;

import pl.cezary.butler.walili.common.Task;
import java.util.logging.Level;
import java.util.logging.Logger;
import pl.cezary.butler.walili.server.db.tables.ZadPolozenie;
import pl.cezary.butler.walili.server.db.tables.ZadReszta;
import pl.cezary.butler.walili.server.db.tables.ZadaniaId;
import pl.cezary.butler.walili.server.db.utils.TableDefinitionUtils;

/**
 *
 * @author Przemysław Bałdyga
 */
public class CreateTaskTask extends UpdateTask {

    private static final Logger log = Logger.getLogger(CreateTaskTask.class.getName());
    private final String POLOZENIE;
    private final String CEL;
    private final String CELURL;
    private int STATUS;
    private int PRIORYTET;    
    private final String MIME;
    
    int idPolozenie;
    int idReszta;

    public CreateTaskTask(Task z) {
        STATUS = z.getStatus().ordinal();
        PRIORYTET = z.getPriorytet();
        POLOZENIE = z.getPolozenie();
        CEL = z.getCel();
        MIME = z.getMimeType();
        CELURL = z.getCelURL().toString();
    }

    @Override
    public String toString() {
        return "CreateTaskTask{" + "POLOZENIE=" + POLOZENIE + ", CEL=" + CEL + ", STATUS=" + STATUS + ", PRIORYTET=" + PRIORYTET + ", MIME=" + MIME + '}';
    }

    @Override
    public void execute() {
        idPolozenie = ZadPolozenie.EMPTY_LOCATION_ID;                

        if (POLOZENIE != null) {
            idPolozenie = getJdbcTemplate().queryForIntIfEmpty(TableDefinitionUtils.getQueryForColumn(ZadPolozenie.id_polozenie) + String.format(" WHERE %s=? LIMIT 1", ZadPolozenie.polozenie),
                new Object[]{POLOZENIE});
            if(idPolozenie==0){
                idPolozenie = getJdbcTemplate().insert(ZadPolozenie.class, getIdFactory().generateId(), POLOZENIE);
                log.log(Level.FINE, "Dodano polozenie #{0}", idPolozenie);
                assert (idPolozenie != 0);
            }
        }

        idReszta = getJdbcTemplate().queryForIntIfEmpty(TableDefinitionUtils.getQueryForColumn(ZadReszta.id_reszta) + String.format(" WHERE %s=? LIMIT 1", ZadReszta.celUrl), CELURL);
        if (idReszta == 0 && CEL != null) {
            idReszta = getJdbcTemplate().insert(ZadReszta.class, getIdFactory().generateId(), CEL, CELURL, STATUS, PRIORYTET, null, null, MIME );
            log.log(Level.FINE,"Dodano reszte zadania #{0}",idReszta);
            assert(idReszta!=0);
        }

        if (POLOZENIE == null && CEL == null) {
            return;
        } else {
            
            if (!getJdbcTemplate().queryForObject(
                    String.format("SELECT EXISTS(SELECT 1 FROM %s WHERE %s=? AND %s=?)",
                    ZadaniaId.id_polozenie.getTable(), ZadaniaId.id_polozenie, ZadaniaId.id_reszta), Boolean.class, idPolozenie, idReszta)) {
                getJdbcTemplate().insert(ZadaniaId.class, idPolozenie, idReszta);
            }
            /*int id_resztaZad = getJdbcTemplate().queryForIntIfEmpty(
                    TableDefinitionUtils.getQueryForColumn(ZadaniaId.id_reszta)+
                    String.format(" WHERE %s=? AND %s=?", ZadaniaId.id_polozenie, ZadaniaId.id_reszta),
                    new Object[]{idPolozenie, idReszta});
            if (idReszta != id_resztaZad) {
               log.fine("Dodanie wpisu do tableli łączącej");
               int rows = getJdbcTemplate().update(TableDefinitionUtils.getPreparedStatementCreator(ZadaniaId.class, idPolozenie, idReszta));
               assert(rows==1);
            }*/
        }
       

        log.log(Level.FINE, "DBNewTask:Dodano zadanie o celu: {0} i polozeniu: {1}", new Object[]{CEL, POLOZENIE});

    }
}
